#include <iostream>

using namespace std;
class Person
{

public:
    int age;
    int *p;

    ~Person()
    {
        cout << "析构函数调用了" << endl;
    }
};

int main(int argc, char const *argv[])
{
    
    // Person person; // 调用了无参构造函数，在栈上分配空间，会自动释放栈空间

    Person *person = new Person(); // 在堆上分配的空间，需要手动释放
    person->p = new int(10);
    int *temp = person->p;
    delete person;

    cout << *temp << endl; // 正常情况下，这里还是可以获取到 10的
    /*
        原因，在堆上，创建了一块区域，存储了Person 中的所有的属性
        如果使用了 person -> p = new int(10);
        此时就会在堆上开辟另一块空间 int(10)
        当 delete person 对象时，只是delete 了person 中的指针本身，指针所指向的对象 int 没有被释放，造成了内存泄漏。
        所以可以在析构函数中添加上 对 p 指针 delete 的操作。
        ~Person()
        {
            std::cout << "析构函数执行了~" << std::endl;
            if (p != nullptr) // 或者 if (p != NULL)
            {
                delete p;
                p = nullptr; // p = NULL;
            }
        }
    */

    return 0;
}
